#include <iostream>
#include <thread>
#include <mutex>
#include <future>


/*future与shard_future的用途都是为了占位，但是两者有些许差别。
future的get()成员函数是转移数据所有权;shared_future的get()成员函数是复制数据。
因此：
future对象的get()只能调用一次；无法实现多个线程等待同一个异步线程，一旦其中一个线程获取了异步线程的返回值，其他线程就无法再次获取。
shared_future对象的get()可以调用多次；可以实现多个线程等待同一个异步线程，每个线程都可以获取异步线程的返回值。*/
using namespace std;

int fun1(int a,int b )
{

    int c=a+b;
    this_thread::sleep_for(chrono::seconds(5));

    return c;

}


int main()
{
    int a=1;
    int b=9;

    future <int> fu=async(fun1,a,b);
    //future<int> fu=async(fun1,a,b);
    cout<<"im  caling,please wait"<<endl;

    cout<<"...."<<endl;

    cout<<"ret:"<<fu.get()<<endl;//阻塞主线程，直至异步线程return,重点是只能获取一次，在获取一次就会报错，注定只能被一个线程获取等待
     //cout << "计算结果：" << fu.get() << endl;//取消该语句注释后运行会报错，因为future对象的get()方法只能调用一次
    cout<<"over"<<endl;
    return 0;
}
